// src/store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
import user from './module/user'    // 引入 user 模块
import { login, logout, getUserInfo } from '../api/api'    // 引入 api 接口


Vue.use(Vuex)    // 安装 Vuex 插件
// 创建一个新的 Vuex Store 实例，即全局储存库


const store = new Vuex.Store({
  modules: {    // modules 对象，用于存放多个模块
    user: user,    // 将 user 模块添加到 modules 中
  },
  state: {       // state 对象，用于存储数据
    isLogin: false,         // 定义了一个 isLogin 属性，初始值为 false，这个属性就可以在任何组件中访问
	count: 0
  },
  mutations: {    // mutations 对象，用于修改数据的方法
    setLogin(state, data) {    // 定义一个 setLogin 方法，接收 state 作为参数
      state.isLogin = data    // 修改 isLogin 属性的值
    },
    clearUser(state) {
      state.user = {}
      state.isLogin = false
    }
  },
  actions: {    // actions 对象，用于处理异步操作的方法
    loginAsync ({ commit }, data) {
      return login(data).then(res => {
        if (res.data.code === 200) {
          commit('setLogin', true)            // Vuex 标记已登录
          localStorage.setItem('user', JSON.stringify(res.data.user))
        } else {
          // 直接把后端报错抛出去，组件里统一捕获
          return Promise.reject(res.data.error)
        }
      })
    },
    logoutAsync(context) {   // 定义一个 logoutAsync 方法，接收 context 作为参数
      return logout().then(res => {   // 调用 api 接口的 logout 方法
        if (res.data.code == 200) {   // 如果注销成功，则修改 isLogin 属性的值为 false，并清除用户信息和 token
          context.commit('setLogin', false)
          context.commit('clearUser')   // 清除用户信息
          localStorage.removeItem('user')

          return Promise.resolve()
        } else {
            alert(res.data.error)   // 如果注销失败，则弹出提示信息
            return Promise.reject(res.data.error)
            }
        })
    },
    getUserInfoAsync(context) {   // 定义一个 getUserInfoAsync 方法，接收 context 作为参数
      getUserInfo(username).then(res => {   // 调用 api 接口的 getUserInfo 方法
        if (res.data.code == 200) {   // 如果获取用户信息成功，则将用户信息保存到 state 中
          context.commit('user/setUser', res.data.data, { root: true })   // 将用户信息保存到 user 模块中
        } else {
          alert(res.data.error)   // 如果获取用户信息失败，则弹出提示信息
        }
      })
    }
    }
})
export default store     // 导出 store 对象，让 main.js 文件可以使用
